/**
 * @param {number[]} nums
 * @return {number}
 */
var jump = function (nums) {
    if (nums.length === 1) return 0
    // 数组有俩个,说明至少要两步
    let count = 1
    // 这是最后一个下标
    let len = nums.length - 1

    let cur = 0
    // 当前可以覆盖的下标
    let cover = nums[0]



    // 条件是如果cover还没到最后结尾,那就肯定需要再走一步.
    while (cover < len) {
        // 进来就应该
        count++

        // 现在获取当前下标可以覆盖的数组

        let max = cur + nums[cur]
        let next = cur

        for (let idx = cur; idx < cover + 1; idx++) {
            const num = nums[idx];
            if (max < (idx + num)) {
                // 计算当前数组中可以覆盖范围的最大值
                max = idx + num
                // 当前下标就是最优解
                next = idx
            }

        }

        // 循环后得到了  下一步覆盖范围最大的下标
        cur = next
        cover = cur + nums[cur]
    }

    return count


};


/**
 * @param {number[]} nums
 * @return {number}
 */
var jump = function (nums) {
    let len = nums.length;
    let end = 0;
    let max = 0;
    let steps = 0;
    for (let i = 0; i < len - 1; i++) {
        max = Math.max(max, i + nums[i]);
        if (i === end) {
            end = max;
            steps++;
        }
    }
    return steps;
};